//package cn.kivensoft.xlsx.writer;
//
//import java.io.ByteArrayOutputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.OutputStream;
//import java.io.StringReader;
//import java.io.StringWriter;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Calendar;
//import java.util.Collections;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.LinkedHashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;
//
//import javax.xml.parsers.DocumentBuilder;
//import javax.xml.parsers.DocumentBuilderFactory;
//import javax.xml.transform.OutputKeys;
//import javax.xml.transform.Result;
//import javax.xml.transform.Source;
//import javax.xml.transform.Transformer;
//import javax.xml.transform.TransformerFactory;
//import javax.xml.transform.dom.DOMSource;
//import javax.xml.transform.stream.StreamResult;
//
//import org.w3c.dom.Document;
//import org.xml.sax.InputSource;
//
//import cn.kivensoft.xlsx.writer.Cell.Range;
//import cn.kivensoft.xlsx.writer.Style.CellXf;
//import cn.kivensoft.xlsx.writer.Style.Fill;
//import cn.kivensoft.xlsx.writer.Style.Fill.PatternValue;
//import cn.kivensoft.xlsx.writer.Style.Font;
//import cn.kivensoft.xlsx.writer.Style.NumberFormat;
//import cn.kivensoft.xlsx.writer.Style.CellXf.HorizontalAlignValue;
//import cn.kivensoft.xlsx.writer.Style.CellXf.VerticallAlignValue;
//import cn.kivensoft.xlsx.writer.Workbook.OrganizeStyles;
//import cn.kivensoft.xlsx.writer.Worksheet.SheetProtectionValue;
//
///**
// * XML文件生成，压缩, 内部使用类
// */
//public class LowLevel {
//	private Workbook workbook;
//	private Map<String, String> sharedStrings;
//	private int sharedStringsTotalCount;
//
//	private Calendar baseCalendar;
//	private Calendar currCalendar;
//
//	public LowLevel(Workbook workbook) {
//		this.workbook = workbook;
//		sharedStrings = new LinkedHashMap<String, String>();
//		sharedStringsTotalCount = 0;
//
//		baseCalendar = Calendar.getInstance();
//		baseCalendar.set(1899, 11, 29);
//		currCalendar = Calendar.getInstance();
//	}
//	
//	public void save() throws Exception {
//		FileOutputStream fos = new FileOutputStream(workbook.getFileName());
//		try {
//			save(fos);
//		} finally {
//			fos.close();
//		}
//	}
//
//	public void save(OutputStream output) throws Exception {
//		try {
//			workbook.resolveMergedCells();
//			Document app = createAppPropertiesDocument();
//			Document core = createCorePropertiesDocument();
//			Document styles = createStyleSheetDocument();
//			Document book = createWorkbookDocument();
//			Packer p = new Packer();
//			Relationship rel = p.createRelationship("_rels/.rels");
//			rel.addRelationshipEntry("/xl/workbook.xml",
//					"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument");
//			rel.addRelationshipEntry("/docProps/core.xml",
//					"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties");
//			rel.addRelationshipEntry("/docProps/app.xml",
//					"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties");
//			rel = p.createRelationship("xl/_rels/workbook.xml.rels");
//			for (int i = 0, n = workbook.getWorksheets().size(); i < n; i++) {
//				Worksheet sheet = workbook.getWorksheets().get(i);
//				Document doc = createWorksheetPart(sheet);
//				String file = "sheet" + Integer.toString(sheet.getSheetID()) + ".xml";
//				rel.addRelationshipEntry("/xl/worksheets/" + file,
//					"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet");
//				p.addPart("xl/worksheets/" + file,
//					"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
//					doc);
//			}
//			rel.addRelationshipEntry("/xl/styles.xml",
//				"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles");
//			rel.addRelationshipEntry("/xl/sharedStrings.xml",
//				"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings");
//			p.addPart("docProps/core.xml",
//				"application/vnd.openxmlformats-package.core-properties+xml", core);
//			p.addPart("docProps/app.xml",
//				"application/vnd.openxmlformats-officedocument.extended-properties+xml", app);
//			p.addPart("xl/sharedStrings.xml",
//				"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
//				createSharedStringsDocument());
//			p.addPart("xl/workbook.xml", 
//				"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
//				book, false);
//			p.addPart("xl/styles.xml",
//				"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", styles);
//			p.pack(output);
//		} catch (Exception e) {
//			throw new IOException("Error while creating the workbook document during saving.", e);
//		}
//	}
//
//	/**
//	 * 创建工作表
//	 */
//	private Document createWorksheetPart(Worksheet worksheet) {
//		worksheet.recalculateAutoFilter();
//		worksheet.recalculateColumns();
//		List<List<Cell>> celldata = getSortedSheetData(worksheet);
//		StringBuilder sb = new StringBuilder(1024);
//		String line = "";
//		sb.append("<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"")
//				.append(" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"")
//				//.append(" mc:Ignorable=\"x14ac\"")
//				//.append(" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\">");
//				.append('>');
//
//		if (worksheet.getSelectedCells() != null) {
//			sb.append("<sheetViews><sheetView workbookViewId=\"0\"");
//			if (workbook.getSelectedWorksheet() == worksheet.getSheetID() - 1)
//				sb.append(" tabSelected=\"1\"");
//
//			sb.append("><selection sqref=\"");
//			sb.append(worksheet.getSelectedCells().toString());
//			sb.append("\" activeCell=\"");
//			sb.append(worksheet.getSelectedCells().startAddress.toString());
//			sb.append("\"/></sheetView></sheetViews>");
//		}
//
//		//sb.append("<sheetFormatPr x14ac:dyDescent=\"0.25\" defaultRowHeight=\"")
//		sb.append("<sheetFormatPr defaultRowHeight=\"")
//				.append(worksheet.getDefaultRowHeight())
//				.append("\" baseColWidth=\"")
//				.append(worksheet.getDefaultColumnWidth()).append("\"/>");
//
//		String colWidths = createColsString(worksheet);
//		if (colWidths != null && colWidths.length() > 0)
//			sb.append("<cols>").append(colWidths).append("</cols>");
//
//		sb.append("<sheetData>");
//		for (List<Cell> item : celldata) {
//			line = createRowString(item, worksheet);
//			if (line != null) sb.append(line);
//		}
//		sb.append("</sheetData>");
//
//		sb.append(createMergedCellsString(worksheet));
//		sb.append(createSheetProtectionString(worksheet));
//		if (worksheet.getAutoFilterRange() != null)
//			sb.append("<autoFilter ref=\"")
//					.append(worksheet.getAutoFilterRange().toString())
//					.append("\"/>");
//
//		sb.append("</worksheet>");
//
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 创建样式表
//	 */
//	private Document createStyleSheetDocument() throws Exception {
//		OrganizeStyles styles = workbook.reorganizeStyles();
//		String bordersString = createStyleBorderString(styles.borders);
//		String fillsString = createStyleFillString(styles.fills);
//		String fontsString = createStyleFontString(styles.fonts);
//		String numberFormatsString = createStyleNumberFormatString(styles.numberFormats);
//		int numFormatCount = getNumberFormatStringCounter(styles.numberFormats);
//		String xfsStings = createStyleXfsString(workbook.getStyles());
//		String mruColorString = createMruColorsString(styles.fonts, styles.fills);
//		StringBuilder sb = new StringBuilder(1024);
//
//		sb.append("<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"")
//				.append(" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"")
//				//.append(" mc:Ignorable=\"x14ac\"")
//				//.append(" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\">");
//				.append('>');
//
//		if (numFormatCount > 0) {
//			sb.append("<numFmts count=\"").append(numFormatCount).append("\">")
//					.append(numberFormatsString).append("</numFmts>");
//		}
//
//		//sb.append("<fonts x14ac:knownFonts=\"1\" count=\"")
//		sb.append("<fonts count=\"")
//				.append(styles.fonts.size()).append("\">")
//				.append(fontsString).append("</fonts>").append("<fills count=\"")
//				.append(styles.fills.size()).append("\">")
//				.append(fillsString).append("</fills>").append("<borders count=\"")
//				.append(styles.borders.size()).append("\">")
//				.append(bordersString).append("</borders>")
//				.append("<cellXfs count=\"")
//				.append(workbook.getStyles().size()).append("\">")
//				.append(xfsStings).append("</cellXfs>");
//
//		if (workbook.getWorkbookMetadata() != null) {
//			if (mruColorString != null && mruColorString.length() > 0
//					&& workbook.getWorkbookMetadata().useColorMRU) {
//				sb.append("<colors>").append(mruColorString).append("</colors>");
//			}
//		}
//		sb.append(createColorsString()); //自定义调色板
//		sb.append("</styleSheet>");
//
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 创建应用属性表
//	 */
//	private Document createAppPropertiesDocument() {
//		StringBuilder sb = new StringBuilder();
//		sb.append("<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\"")
//				.append(" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">");
//		sb.append(createAppString());
//		sb.append("</Properties>");
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 创建核心属性表
//	 */
//	private Document createCorePropertiesDocument() {
//		StringBuilder sb = new StringBuilder();
//		sb.append("<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"")
//				.append(" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"")
//				.append(" xmlns:dcterms=\"http://purl.org/dc/terms/\"")
//				.append(" xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\"")
//				.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
//		sb.append(createCorePropertiesString());
//		sb.append("</cp:coreProperties>");
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 创建工作薄
//	 */
//	private Document createWorkbookDocument() {
//		if (workbook.getWorksheets().size() == 0)
//			throw new RuntimeException("The workbook no worksheet was defined.");
//
//		StringBuilder sb = new StringBuilder();
//		sb.append(
//				"<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"")
//				.append(" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">");
//		if (workbook.getSelectedWorksheet() > 0)
//			sb.append("<bookViews><workbookView activeTab=\"")
//					.append(workbook.getSelectedWorksheet())
//					.append("\"/></bookViews>");
//
//		if (workbook.getUseWorkbookProtection()) {
//			sb.append("<workbookProtection");
//			if (workbook.getLockWindowsIfProtected())
//				sb.append(" lockWindows=\"1\"");
//
//			if (workbook.getLockStructureIfProtected())
//				sb.append(" lockStructure=\"1\"");
//
//			if (workbook.getWorkbookProtectionPassword() != null
//					&& workbook.getWorkbookProtectionPassword().length() > 0)
//				sb.append("workbookPassword=\"")
//						.append(generatePasswordHash(workbook
//								.getWorkbookProtectionPassword())).append("\"");
//
//			sb.append("/>");
//		}
//
//		sb.append("<sheets>");
//		for (Worksheet item : workbook.getWorksheets()) {
//			sb.append("<sheet r:id=\"rId")
//					.append(item.getSheetID())
//					.append("\" sheetId=\"")
//					.append(item.getSheetID())
//					.append("\" name=\"")
//					.append(LowLevel.escapeXMLAttributeChars(item
//							.getSheetName())).append("\"/>");
//		}
//		sb.append("</sheets></workbook>");
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 创建共享字符串表
//	 */
//	private Document createSharedStringsDocument() {
//		StringBuilder sb = new StringBuilder();
//		sb.append("<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"")
//				.append(" count=\"").append(sharedStringsTotalCount)
//				.append("\" uniqueCount=\"").append(sharedStrings.size())
//				.append("\">");
//		for (Map.Entry<String, String> item : sharedStrings.entrySet()) {
//			sb.append("<si><t>").append(escapeXMLChars(item.getKey()))
//					.append("</t></si>");
//		}
//		sb.append("</sst>");
//		return createXMLDocument(sb.toString());
//	}
//
//	/**
//	 * 解析工作表中的共享字符串
//	 * 
//	 * @param sheet 工作表
//	 */
//	private List<List<Cell>> getSortedSheetData(Worksheet sheet) {
//		List<Cell> temp = new ArrayList<Cell>();
//		for (Map.Entry<String, Cell> item : sheet.getCells().entrySet())
//			temp.add(item.getValue());
//		Collections.sort(temp);
//
//		List<Cell> line = new ArrayList<Cell>();
//		List<List<Cell>> output = new ArrayList<List<Cell>>();
//		if (temp.size() > 0) {
//			int rowNumber = temp.get(0).rowAddress;
//			for (Cell item : temp) {
//				if (item.rowAddress != rowNumber) {
//					output.add(line);
//					line = new ArrayList<Cell>();
//					rowNumber = item.rowAddress;
//				}
//				line.add(item);
//			}
//			if (line.size() > 0) output.add(line);
//		}
//
//		return output;
//	}
//
//	/**
//	 * 创建一行数据字符串
//	 * 
//	 * @param columnFields 单元格列表
//	 * @param worksheet 工作表
//	 * @return 格式化后的字符串
//	 */
//	private String createRowString(List<Cell> columnFields, Worksheet worksheet) {
//		int rowNumber = columnFields.get(0).rowAddress;
//		String heigth = "";
//		String hidden = "";
//
//		if (worksheet.getRowHeights().containsKey(rowNumber)) {
//			if (worksheet.getRowHeights().get(rowNumber) != worksheet.getDefaultRowHeight())
//				heigth = " customHeight=\"1\" ht=\"" + worksheet.getRowHeights().get(rowNumber) + "\"";
//		}
//
//		// heigth = " x14ac:dyDescent=\"0.25\" customHeight=\"1\" ht=\"" +
//		// worksheet.RowHeights[rowNumber].ToString("G", culture) + "\"";
//		if (worksheet.getHiddenRows().containsKey(rowNumber)) {
//			if (worksheet.getHiddenRows().get(rowNumber))
//				hidden = " hidden=\"1\"";
//		}
//
//		StringBuilder sb = new StringBuilder();
//		if (columnFields.size() > 0)
//			sb.append("<row r=\"").append(rowNumber + 1).append("\"")
//					.append(heigth).append(hidden).append(">");
//		else
//			sb.append("<row").append(heigth).append(">");
//
//		String typeAttribute;
//		String sValue;
//		String tValue;
//		String value = "";
//		Date dVal = new Date();
//		for (Cell item : columnFields) {
//			tValue = " ";
//			if (item.cellStyle != null)
//				sValue = " s=\"" + item.cellStyle.internalID + "\" ";
//			else
//				sValue = "";
//			item.resolveCellType();
//			Cell.CellType _ct = item.fieldtype;
//			// Recalculate the type (for handling DEFAULT)
//			if (_ct == Cell.CellType.BOOL) {
//				typeAttribute = "b";
//				tValue = " t=\"" + typeAttribute + "\" ";
//				value = (Boolean) item.value ? "1" : "0";
//			}
//			// Number casting
//			else if (_ct == Cell.CellType.NUMBER) {
//				typeAttribute = "n";
//				tValue = " t=\"" + typeAttribute + "\" ";
//				Object _obj = item.value;
//				if (_obj instanceof Integer)
//					value = ((Integer) item.value).toString();
//				else if (_obj instanceof Long)
//					value = ((Long) item.value).toString();
//				else if (_obj instanceof Double)
//					value = ((Double) item.value).toString();
//				else if (_obj instanceof Float)
//					value = ((Float) item.value).toString();
//			}
//			// Date parsing
//			else if (_ct == Cell.CellType.DATE) {
//				typeAttribute = "d";
//				dVal = (Date) item.value;
//				value = Double.toString(getOADate(dVal));
//			} else {
//				// String parsing
//				if (item.value == null) {
//					typeAttribute = "str";
//					value = "";
//				} else {
//					// Handle sharedStrings
//					if (_ct == Cell.CellType.FORMULA) {
//						typeAttribute = "str";
//						value = item.value.toString();
//					} else {
//						typeAttribute = "s";
//						value = item.value.toString();
//						if (!sharedStrings.containsKey(value))
//							sharedStrings.put(value, Integer.toString(sharedStrings.size()));
//
//						value = sharedStrings.get(value);
//						sharedStringsTotalCount++;
//					}
//				}
//				tValue = " t=\"" + typeAttribute + "\" ";
//			}
//			if (_ct != Cell.CellType.EMPTY) {
//				sb.append("<c").append(tValue).append("r=\"")
//						.append(item.getCellAddress()).append("\"")
//						.append(sValue).append(">");
//				if (_ct == Cell.CellType.FORMULA)
//					sb.append("<f>")
//							.append(escapeXMLChars(item.value.toString()))
//							.append("</f>");
//				else
//					sb.append("<v>").append(escapeXMLChars(value)).append("</v>");
//				sb.append("</c>");
//			} else {
//				// Empty cell
//				sb.append("<c").append(tValue).append("r=\"")
//						.append(item.getCellAddress()).append("\"")
//						.append(sValue).append("/>");
//			}
//		}
//		sb.append("</row>");
//		return sb.toString();
//	}
//
//	/**
//	 * 创建合并单元格字符串
//	 * 
//	 * @param sheet 工作表
//	 * @return 格式化后的合并单元格字符串
//	 */
//	private String createMergedCellsString(Worksheet sheet) {
//		if (sheet.getMergedCells().size() < 1) return "";
//
//		StringBuilder sb = new StringBuilder();
//		sb.append("<mergeCells count=\"")
//				.append(sheet.getMergedCells().size())
//				.append("\">");
//		for (Map.Entry<String, Range> item : sheet.getMergedCells().entrySet())
//			sb.append("<mergeCell ref=\"")
//					.append(item.getValue().toString())
//					.append("\"/>");
//		sb.append("</mergeCells>");
//		return sb.toString();
//	}
//
//	/**
//	 * 创建工作表属性 
//	 */
//	private String createSheetProtectionString(Worksheet sheet) {
//		if (!sheet.getUseSheetProtection()) return "";
//
//		Map<SheetProtectionValue, Integer> actLockVals
//				= new HashMap<SheetProtectionValue, Integer>();
//		List<Worksheet.SheetProtectionValue> _spv
//				= sheet.getSheetProtectionValues();
//
//		if (_spv.size() == 0) {
//			actLockVals.put(SheetProtectionValue.selectLockedCells, 1);
//			actLockVals.put(SheetProtectionValue.selectUnlockedCells, 1);
//		}
//
//		if (!_spv.contains(SheetProtectionValue.objects))
//			actLockVals.put(SheetProtectionValue.objects, 1);
//
//		if (!_spv.contains(SheetProtectionValue.scenarios))
//			actLockVals.put(SheetProtectionValue.scenarios, 1);
//
//		if (!_spv.contains(SheetProtectionValue.selectLockedCells)) {
//			if (!actLockVals.containsKey(SheetProtectionValue.selectLockedCells))
//				actLockVals.put(SheetProtectionValue.selectLockedCells, 1);
//		}
//
//		if (!_spv.contains(SheetProtectionValue.selectUnlockedCells)
//				|| !_spv.contains(SheetProtectionValue.selectLockedCells)) {
//			if (!actLockVals
//					.containsKey(SheetProtectionValue.selectUnlockedCells))
//				actLockVals.put(SheetProtectionValue.selectUnlockedCells, 1);
//		}
//
//		if (_spv.contains(SheetProtectionValue.formatCells))
//			actLockVals.put(SheetProtectionValue.formatCells, 0);
//
//		if (_spv.contains(SheetProtectionValue.formatColumns))
//			actLockVals.put(SheetProtectionValue.formatColumns, 0);
//
//		if (_spv.contains(SheetProtectionValue.formatRows))
//			actLockVals.put(SheetProtectionValue.formatRows, 0);
//
//		if (_spv.contains(SheetProtectionValue.insertColumns))
//			actLockVals.put(SheetProtectionValue.insertColumns, 0);
//
//		if (_spv.contains(SheetProtectionValue.insertRows))
//			actLockVals.put(SheetProtectionValue.insertRows, 0);
//
//		if (_spv.contains(SheetProtectionValue.insertHyperlinks))
//			actLockVals.put(SheetProtectionValue.insertHyperlinks, 0);
//
//		if (_spv.contains(SheetProtectionValue.deleteColumns))
//			actLockVals.put(SheetProtectionValue.deleteColumns, 0);
//
//		if (_spv.contains(SheetProtectionValue.deleteRows))
//			actLockVals.put(SheetProtectionValue.deleteRows, 0);
//
//		if (_spv.contains(SheetProtectionValue.sort))
//			actLockVals.put(SheetProtectionValue.sort, 0);
//
//		if (_spv.contains(SheetProtectionValue.autoFilter))
//			actLockVals.put(SheetProtectionValue.autoFilter, 0);
//
//		if (_spv.contains(SheetProtectionValue.pivotTables))
//			actLockVals.put(SheetProtectionValue.pivotTables, 0);
//
//		StringBuilder sb = new StringBuilder();
//		sb.append("<sheetProtection");
//		for (Map.Entry<SheetProtectionValue, Integer> item : actLockVals.entrySet())
//			sb.append(" ").append(item.getKey()).append("=\"")
//					.append(item.getValue()).append("\"");
//
//		String _spp = sheet.getSheetProtectionPassword();
//		if (_spp != null && _spp.length() > 0) {
//			String hash = generatePasswordHash(sheet.getSheetProtectionPassword());
//			sb.append(" password=\"").append(hash).append("\"");
//		}
//
//		sb.append(" sheet=\"1\"/>");
//		return sb.toString();
//	}
//
//	/**
//	 * 创建应用程序字符串
//	 */
//	private String createAppString() {
//		if (workbook.getWorkbookMetadata() == null) return "";
//
//		Metadata md = workbook.getWorkbookMetadata();
//		StringBuilder sb = new StringBuilder(512);
//		appendXMLtag(sb, "0", "TotalTime", null);
//		appendXMLtag(sb, md.application, "Application", null);
//		appendXMLtag(sb, "0", "DocSecurity", null);
//		appendXMLtag(sb, "false", "ScaleCrop", null);
//		appendXMLtag(sb, md.manager, "Manager", null);
//		appendXMLtag(sb, md.company, "Company", null);
//		appendXMLtag(sb, "false", "LinksUpToDate", null);
//		appendXMLtag(sb, "false", "SharedDoc", null);
//		appendXMLtag(sb, md.hyperlinkBase, "HyperlinkBase", null);
//		appendXMLtag(sb, "false", "HyperlinksChanged", null);
//		appendXMLtag(sb, md.applicationVersion, "AppVersion", null);
//		return sb.toString();
//	}
//
//	/**
//	 * 创建Excel文件属性表
//	 */
//	private String createCorePropertiesString() {
//		if (workbook.getWorkbookMetadata() == null) return "";
//
//		Metadata md = workbook.getWorkbookMetadata();
//		StringBuilder sb = new StringBuilder();
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
//		appendXMLtag(sb, md.title, "title", "dc");
//		appendXMLtag(sb, md.subject, "subject", "dc");
//		appendXMLtag(sb, md.creator, "creator", "dc");
//		appendXMLtag(sb, md.creator, "lastModifiedBy", "cp");
//		appendXMLtag(sb, md.keywords, "keywords", "cp");
//		appendXMLtag(sb, md.description, "description", "dc");
//		String time = sdf.format(new Date());
//		sb.append("<dcterms:created xsi:type=\"dcterms:W3CDTF\">").append(time)
//				.append("</dcterms:created>");
//		sb.append("<dcterms:modified xsi:type=\"dcterms:W3CDTF\">")
//				.append(time).append("</dcterms:modified>");
//		appendXMLtag(sb, md.category, "category", "cp");
//		appendXMLtag(sb, md.contentStatus, "contentStatus", "cp");
//		return sb.toString();
//	}
//
//	/**
//	 * 创建字体样式 
//	 */
//	private String createStyleFontString(List<Style.Font> fontStyles) {
//		StringBuilder sb = new StringBuilder();
//		for (Style.Font item : fontStyles) {
//			sb.append("<font>");
//			if (item.bold) sb.append("<b/>");
//			if (item.italic) sb.append("<i/>");
//			if (item.underline) sb.append("<u/>");
//			if (item.doubleUnderline) sb.append("<u val=\"double\"/>");
//			if (item.strike) sb.append("<strike/>");
//
//			if (item.verticalAlign == Style.Font.VerticalAlignValue.subscript)
//				sb.append("<vertAlign val=\"subscript\"/>");
//			else if (item.verticalAlign == Style.Font.VerticalAlignValue.superscript)
//				sb.append("<vertAlign val=\"superscript\"/>");
//
//			sb.append("<sz val=\"").append(item.size).append("\"/>");
//
//			String _cv = item.colorValue;
//			if (_cv == null || _cv.length() == 0)
//				sb.append("<color indexed=\"8\"/>");
//			else
//				sb.append("<color rgb=\"").append(_cv).append("\"/>");
//
//			sb.append("<name val=\"").append(item.name).append("\"/>");
//			sb.append("<charset val=\"134\"/>");
//
//			String _cs = item.charset;
//			if (_cs != null && _cs.length() > 0)
//				sb.append("<charset val=\"").append(_cs).append("\"/>");
//
//			sb.append("</font>");
//		}
//		return sb.toString();
//	}
//
//	/**
//	 * 创建单元格边框样式 
//	 */
//	private String createStyleBorderString(List<Style.Border> borderStyles) {
//		StringBuilder sb = new StringBuilder();
//		for (Style.Border item : borderStyles) {
//			if (item.diagonalDown && !item.diagonalUp)
//				sb.append("<border diagonalDown=\"1\">");
//			else if (!item.diagonalDown && item.diagonalUp)
//				sb.append("<border diagonalUp=\"1\">");
//			else if (item.diagonalDown && item.diagonalUp)
//				sb.append("<border diagonalDown=\"1\" diagonalUp=\"1\">");
//			else
//				sb.append("<border>");
//
//			if (item.leftStyle != Style.Border.StyleValue.none) {
//				sb.append("<left style=\"")
//						.append(Style.Border.getStyleName(item.leftStyle))
//						.append("\">");
//
//				String _lc = item.leftColor;
//				if (_lc == null || _lc.length() == 0)
//					sb.append("<color rgb=\"").append(item.leftColor).append("\"/>");
//				else
//					sb.append("<color auto=\"1\"/>");
//
//				sb.append("</left>");
//			} else {
//				sb.append("<left/>");
//			}
//
//			if (item.rightStyle != Style.Border.StyleValue.none) {
//				sb.append("<right style=\"")
//						.append(Style.Border.getStyleName(item.rightStyle))
//						.append("\">");
//
//				String _rc = item.rightColor;
//				if (_rc == null || _rc.length() == 0)
//					sb.append("<color rgb=\"").append(item.rightColor).append("\"/>");
//				else
//					sb.append("<color auto=\"1\"/>");
//
//				sb.append("</right>");
//			} else {
//				sb.append("<right/>");
//			}
//
//			if (item.topStyle != Style.Border.StyleValue.none) {
//				sb.append("<top style=\"")
//						.append(Style.Border.getStyleName(item.topStyle))
//						.append("\">");
//
//				String _tc = item.topColor;
//				if (_tc == null || _tc.length() == 0)
//					sb.append("<color rgb=\"").append(item.topColor).append("\"/>");
//				else
//					sb.append("<color auto=\"1\"/>");
//
//				sb.append("</top>");
//			} else {
//				sb.append("<top/>");
//			}
//
//			if (item.bottomStyle != Style.Border.StyleValue.none) {
//				sb.append("<bottom style=\"")
//						.append(Style.Border.getStyleName(item.bottomStyle))
//						.append("\">");
//
//				String _bc = item.bottomColor;
//				if (_bc == null || _bc.length() == 0)
//					sb.append("<color rgb=\"").append(item.bottomColor).append("\"/>");
//				else
//					sb.append("<color auto=\"1\"/>");
//
//				sb.append("</bottom>");
//			} else {
//				sb.append("<bottom/>");
//			}
//
//			if (item.diagonalStyle != Style.Border.StyleValue.none) {
//				sb.append("<diagonal style=\"")
//						.append(Style.Border.getStyleName(
//								item.diagonalStyle)).append("\">");
//
//				String _dc = item.diagonalColor;
//				if (_dc == null || _dc.length() == 0)
//					sb.append("<color rgb=\"").append(item.diagonalColor).append("\"/>");
//				else
//					sb.append("<color auto=\"1\"/>");
//
//				sb.append("</diagonal>");
//			} else {
//				sb.append("<diagonal/>");
//			}
//
//			sb.append("</border>");
//		}
//
//		return sb.toString();
//	}
//
//	/**
//	 * 创建自定义的调色板，主要是替换了其中两种不常用颜色作为表头背景色与记录交替行背景色
//	 * 
//	 * @return
//	 */
//	private String createColorsString() {
//		return "<colors><indexedColors>" 
//				+ "<rgbColor rgb=\"00000000\"/>" + "<rgbColor rgb=\"00FFFFFF\"/>"
//				+ "<rgbColor rgb=\"00FF0000\"/>" + "<rgbColor rgb=\"0000FF00\"/>"
//				+ "<rgbColor rgb=\"000000FF\"/>" + "<rgbColor rgb=\"00FFFF00\"/>"
//				+ "<rgbColor rgb=\"00FF00FF\"/>" + "<rgbColor rgb=\"0000FFFF\"/>"
//				+ "<rgbColor rgb=\"00000000\"/>" + "<rgbColor rgb=\"00FFFFFF\"/>"
//				+ "<rgbColor rgb=\"00FF0000\"/>" + "<rgbColor rgb=\"0000FF00\"/>"
//				+ "<rgbColor rgb=\"000000FF\"/>" + "<rgbColor rgb=\"00FFFF00\"/>"
//				+ "<rgbColor rgb=\"00FF00FF\"/>" + "<rgbColor rgb=\"0000FFFF\"/>"
//				+ "<rgbColor rgb=\"00800000\"/>" + "<rgbColor rgb=\"00008000\"/>"
//				+ "<rgbColor rgb=\"00000080\"/>" + "<rgbColor rgb=\"00808000\"/>"
//				+ "<rgbColor rgb=\"00800080\"/>" + "<rgbColor rgb=\"00008080\"/>"
//				+ "<rgbColor rgb=\"00C0C0C0\"/>" + "<rgbColor rgb=\"00808080\"/>"
//				+ "<rgbColor rgb=\"009999FF\"/>" + "<rgbColor rgb=\"00993366\"/>"
//				+ "<rgbColor rgb=\"00FFFFCC\"/>" + "<rgbColor rgb=\"00CCFFFF\"/>"
//				+ "<rgbColor rgb=\"00660066\"/>" + "<rgbColor rgb=\"00FF8080\"/>"
//				+ "<rgbColor rgb=\"000066CC\"/>" + "<rgbColor rgb=\"00CCCCFF\"/>"
//				+ "<rgbColor rgb=\"00000080\"/>" + "<rgbColor rgb=\"00FF00FF\"/>"
//				+ "<rgbColor rgb=\"00FFFF00\"/>" + "<rgbColor rgb=\"0000FFFF\"/>"
//				+ "<rgbColor rgb=\"00800080\"/>" + "<rgbColor rgb=\"00800000\"/>"
//				+ "<rgbColor rgb=\"00008080\"/>" + "<rgbColor rgb=\"000000FF\"/>"
//				+ "<rgbColor rgb=\"0000CCFF\"/>" + "<rgbColor rgb=\"00CCFFFF\"/>"
//				+ "<rgbColor rgb=\"00CCFFCC\"/>" + "<rgbColor rgb=\"00FFFF99\"/>"
//				+ "<rgbColor rgb=\"0099CCFF\"/>" + "<rgbColor rgb=\"00DCDCDC\"/>"
//				+ "<rgbColor rgb=\"00CC99FF\"/>" + "<rgbColor rgb=\"00F2F2F2\"/>"
//				+ "<rgbColor rgb=\"003366FF\"/>" + "<rgbColor rgb=\"0033CCCC\"/>"
//				+ "<rgbColor rgb=\"0099CC00\"/>" + "<rgbColor rgb=\"00FFCC00\"/>"
//				+ "<rgbColor rgb=\"00FF9900\"/>" + "<rgbColor rgb=\"00FF6600\"/>"
//				+ "<rgbColor rgb=\"00666699\"/>" + "<rgbColor rgb=\"00969696\"/>"
//				+ "<rgbColor rgb=\"00003366\"/>" + "<rgbColor rgb=\"00339966\"/>"
//				+ "<rgbColor rgb=\"00003300\"/>" + "<rgbColor rgb=\"00333300\"/>"
//				+ "<rgbColor rgb=\"00993300\"/>" + "<rgbColor rgb=\"00993366\"/>"
//				+ "<rgbColor rgb=\"00333399\"/>" + "<rgbColor rgb=\"00333333\"/>"
//				+ "</indexedColors></colors>";
//	}
//
//	/** 
//	 * 创建单元格填充样式 
//	 */
// 	private String createStyleFillString(List<Fill> fillStyles) {
//		StringBuilder sb = new StringBuilder();
//		for (Fill item : fillStyles) {
//			sb.append("<fill>").append("<patternFill patternType=\"")
//					.append(Fill.getPatternName(item.patternFill))
//					.append("\"");
//
//			PatternValue pf = item.patternFill;
//			if (pf == Fill.PatternValue.solid) {
//				sb.append(">").append("<fgColor rgb=\"")
//						.append(item.foregroundColor).append("\"/>")
//						.append("<bgColor indexed=\"")
//						.append(item.indexedColor).append("\"/>")
//						.append("</patternFill>");
//			} else if (pf == Fill.PatternValue.mediumGray
//					|| pf == Fill.PatternValue.lightGray
//					|| pf == Fill.PatternValue.gray0625
//					|| pf == Fill.PatternValue.darkGray) {
//				sb.append(">").append("<fgColor rgb=\"")
//						.append(item.foregroundColor).append("\"/>");
//
//				String _bc = item.backgroundColor;
//				if (_bc != null && _bc.length() > 0)
//					sb.append("<bgColor rgb=\"")
//							.append(item.backgroundColor).append("\"/>");
//
//				sb.append("</patternFill>");
//			} else {
//				sb.append("/>");
//			}
//			sb.append("</fill>");
//		}
//
//		return sb.toString();
//	}
//
//	private String createMruColorsString(List<Font> fonts, List<Fill> fills) {
//		StringBuilder sb = new StringBuilder();
//		List<String> tempColors = new ArrayList<String>();
//
//		for (Font item : fonts) {
//			String _cv = item.colorValue;
//			if (_cv != null && _cv.length() > 0
//					&& !Fill.DEFAULTCOLOR.equals(_cv)
//					&& !tempColors.contains(_cv))
//				tempColors.add(_cv);
//		}
//
//		for (Fill item : fills) {
//			String _bc = item.backgroundColor;
//			if (_bc != null && _bc.length() > 0
//					&& !Fill.DEFAULTCOLOR.equals(_bc)
//					&& !tempColors.contains(_bc))
//				tempColors.add(_bc);
//
//			String _fc = item.foregroundColor;
//			if (_fc != null && _fc.length() > 0
//					&& !Fill.DEFAULTCOLOR.equals(_fc)
//					&& !tempColors.contains(_fc))
//				tempColors.add(_fc);
//		}
//
//		if (tempColors.size() > 0) {
//			sb.append("<mruColors>");
//			for (String item : tempColors)
//				sb.append("<color rgb=\"").append(item).append("\"/>");
//			sb.append("</mruColors>");
//			return sb.toString();
//		} else return "";
//	}
//
//	/**
//	 * 创建样式引用字符串
//	 */
//	private String createStyleXfsString(List<Style> styles) {
//		StringBuilder sb = new StringBuilder();
//		StringBuilder sb2 = new StringBuilder();
//		String alignmentString, protectionString;
//		int textRotation;
//		
//		for (Style item : styles) {
//			CellXf _cx = item.currentCellXf;
//			textRotation = _cx.calculateInternalRotation();
//			alignmentString = "";
//			protectionString = "";
//			if (_cx.horizontalAlign != Style.CellXf.HorizontalAlignValue.none
//					|| _cx.verticalAlign != Style.CellXf.VerticallAlignValue.none
//					|| _cx.alignment != Style.CellXf.TextBreakValue.none
//					|| textRotation != 0) {
//
//				sb2.delete(0, sb2.length());
//				sb2.append("<alignment");
//				
//				HorizontalAlignValue _hav = _cx.horizontalAlign;
//				if (_hav != CellXf.HorizontalAlignValue.none) {
//					sb2.append(" horizontal=\"");
//					if (_hav == CellXf.HorizontalAlignValue.center)
//						sb2.append("center");
//					else if (_hav == CellXf.HorizontalAlignValue.right)
//						sb2.append("right");
//					else if (_hav == CellXf.HorizontalAlignValue.centerContinuous)
//						sb2.append("centerContinuous");
//					else if (_hav == CellXf.HorizontalAlignValue.distributed)
//						sb2.append("distributed");
//					else if (_hav == CellXf.HorizontalAlignValue.fill)
//						sb2.append("fill");
//					else if (_hav == CellXf.HorizontalAlignValue.general)
//						sb2.append("general");
//					else if (_hav == CellXf.HorizontalAlignValue.justify)
//						sb2.append("justify");
//					else
//						sb2.append("left");
//					sb2.append("\"");
//				}
//
//				VerticallAlignValue _vav = _cx.verticalAlign;
//				if (_vav != CellXf.VerticallAlignValue.none) {
//					sb2.append(" vertical=\"");
//					if (_vav == CellXf.VerticallAlignValue.center)
//						sb2.append("center");
//					else if (_vav == CellXf.VerticallAlignValue.distributed)
//						sb2.append("distributed");
//					else if (_vav == CellXf.VerticallAlignValue.justify)
//						sb2.append("justify");
//					else if (_vav == CellXf.VerticallAlignValue.top)
//						sb2.append("top");
//					else
//						sb2.append("bottom");
//					sb2.append("\"");
//				}
//
//				if (_cx.alignment != Style.CellXf.TextBreakValue.none) {
//					if (_cx.alignment == Style.CellXf.TextBreakValue.shrinkToFit)
//						sb2.append(" shrinkToFit=\"1");
//					else
//						sb2.append(" wrapText=\"1");
//					sb2.append("\"");
//				}
//
//				if (textRotation != 0)
//					sb2.append(" textRotation=\"").append(textRotation)
//							.append("\"");
//
//				sb2.append("/>");
//				alignmentString = sb2.toString();
//			}
//
//			if (_cx.hidden || _cx.locked) {
//				if (_cx.hidden && _cx.locked) {
//					protectionString = "<protection locked=\"1\" hidden=\"1\"/>";
//				} else if (_cx.hidden && !_cx.locked) {
//					protectionString = "<protection hidden=\"1\" locked=\"0\"/>";
//				} else {
//					protectionString = "<protection hidden=\"0\" locked=\"1\"/>";
//				}
//			}
//
//			NumberFormat _nf = item.currentNumberFormat;
//			sb.append("<xf numFmtId=\"");
//			if (_nf.isCustomFormat())
//				sb.append(_nf.customFormatID);
//			else
//				sb.append(_nf.number);
//
//			sb.append("\" borderId=\"").append(item.currentBorder.internalID);
//			sb.append("\" fillId=\"").append(item.currentFill.internalID);
//			sb.append("\" fontId=\"").append(item.currentFont.internalID);
//
//			if (!item.currentFont.isDefaultFont())
//				sb.append("\" applyFont=\"1");
//
//			if (item.currentFill.patternFill != Style.Fill.PatternValue.none)
//				sb.append("\" applyFill=\"1");
//
//			if (!item.currentBorder.isEmpty())
//				sb.append("\" applyBorder=\"1");
//
//			if (!alignmentString.isEmpty() || _cx.forceApplyAlignment)
//				sb.append("\" applyAlignment=\"1");
//
//			if (!protectionString.isEmpty())
//				sb.append("\" applyProtection=\"1");
//
//			if (item.currentNumberFormat.number != Style.NumberFormat.FORMAT_NONE)
//				sb.append("\" applyNumberFormat=\"1\"");
//			else
//				sb.append("\"");
//
//			if (!alignmentString.isEmpty() || !protectionString.isEmpty())
//				sb.append(">").append(alignmentString).append(protectionString).append("</xf>");
//			else
//				sb.append("/>");
//		}
//		return sb.toString();
//	}
//
//	/**
//	 * 创建列宽定义字符串
//	 */
//	private String createColsString(Worksheet worksheet) {
//		Map<Integer, Worksheet.Column> cols = worksheet.getColumns();
//		if (cols.size() > 0) {
//			int col;
//			String hidden = "";
//			StringBuilder sb = new StringBuilder();
//
//			for (Map.Entry<Integer, Worksheet.Column> item : cols.entrySet()) {
//				Worksheet.Column column = item.getValue();
//				if (column.getWidth() == worksheet.getDefaultColumnWidth()
//						&& !column.getIsHidden())
//					continue;
//
//				if (cols.containsKey(item.getKey()))
//					if (cols.get(item.getKey()).getIsHidden())
//						hidden = " hidden=\"1\"";
//
//				col = item.getKey() + 1;
//				sb.append("<col customWidth=\"1\" width=\"")
//						.append((int)column.getWidth()).append("\" max=\"")
//						.append(col).append("\" min=\"").append(col)
//						.append("\"").append(hidden).append("/>");
//			}
//			return sb.length() == 0 ? "" : sb.toString();
//		}
//		else return "";
//	}
//
//	/**
//	 * 创建格式化信息字符串
//	 */
//	private String createStyleNumberFormatString(List<NumberFormat> numberFormatStyles) {
//		StringBuilder sb = new StringBuilder();
//		for (NumberFormat item : numberFormatStyles) {
//			if (item.isCustomFormat())
//				sb.append("<numFmt formatCode=\"")
//						.append(item.customFormatCode)
//						.append("\" numFmtId=\"")
//						.append(item.customFormatID)
//						.append("\"/>");
//		}
//		return sb.toString();
//	}
//
//	private int getNumberFormatStringCounter(List<NumberFormat> numberFormatStyles) {
//		int counter = 0;
//		for (NumberFormat item : numberFormatStyles) 
//			if (item.isCustomFormat()) counter++;
//		return counter;
//	}
//
//	private boolean appendXMLtag(StringBuilder sb, String value,
//			String tagName, String nameSpace) {
//
//		if (value == null || value.length() == 0) return false;
//		if (sb == null || tagName == null || tagName.length() == 0) return false;
//
//		boolean hasNoNs = (nameSpace == null || nameSpace.length() == 0);
//		sb.append('<');
//		if (!hasNoNs) sb.append(nameSpace).append(':');
//		sb.append(tagName).append(">").append(escapeXMLChars(value)).append("</");
//		if (!hasNoNs) sb.append(nameSpace).append(':');
//		sb.append(tagName).append(">");
//
//		return true;
//	}
//
//	public static String escapeXMLChars(String input) {
//		if (input == null || input.length() == 0) return input;
//
//		StringBuilder sb = new StringBuilder(input.length() + 256);
//		for (int i = 0, n = input.length(); i < n; i++) {
//			char c = input.charAt(i);
//			switch (c) {
//				case '&': sb.append("&amp;"); break;
//				case '<': sb.append("&lt;"); break;
//				case '>': sb.append("&gt;"); break;
//				default: sb.append(c); break;
//			}
//		}
//		return sb.toString();
//	}
//
//	public static String escapeXMLAttributeChars(String input) {
//		if (input == null || input.length() == 0) return input;
//
//		StringBuilder sb = new StringBuilder(input.length() + 256);
//		char ch = '"';
//		int idx = 0;
//		int pos = input.indexOf(ch, idx);
//		while (pos != -1) {
//			sb.append(input, idx, pos).append("&quot;");
//			idx = pos + 1;
//			pos = input.indexOf(ch, idx);
//		}
//		sb.append(input, idx, input.length());
//		return sb.toString();
//	}
//
//	public static Document createXMLDocument(String rawInput) {
//		try {
//			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//			DocumentBuilder docBuilder = factory.newDocumentBuilder();
//			InputSource input = new InputSource(new StringReader(rawInput));
//			input.setEncoding("UTF-8");
//			Document doc = docBuilder.parse(input);
//			doc.setXmlVersion("1.0");
//			doc.setXmlStandalone(true);
//			return doc;
//		} catch (Exception e) {
//			throw new RuntimeException("Error while creating the XML document.", e);
//		}
//	}
//
//	public static byte[] createBytesFromDocument(Document document) {
//		try {
//			TransformerFactory factory = TransformerFactory.newInstance();
//			if (Workbook.getXmlFormatIndent())
//				factory.setAttribute("indent-number", new Integer(2));
//			Transformer transformer = factory.newTransformer();
//			transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
//			if (Workbook.getXmlFormatIndent())
//				transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//			transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
//
//			Source input = new DOMSource(document);
//			if (Workbook.getXmlFormatIndent()) {
//				StringWriter sw = new StringWriter();
//				Result output = new StreamResult(sw);
//				transformer.transform(input, output);
//				sw.flush();
//				byte[] bytes = sw.toString().getBytes();
//				sw.close();
//				return bytes;
//			} else {
//				ByteArrayOutputStream bs = new ByteArrayOutputStream();
//				Result output = new StreamResult(bs);
//				transformer.transform(input, output);
//				bs.flush();
//				byte[] bytes = bs.toByteArray();
//				bs.close();
//				return bytes;
//			}
//		} catch (Exception e) {
//			throw new RuntimeException("Error while creating the byte stream.", e);
//		}
//	}
//    
//	/**
//	 * 转化C#时间为Excel时间格式（OLE格式）
//	 */
//	public double getOADate(Date date) {
//		currCalendar.setTime(date);
//		long t1 = baseCalendar.getTimeInMillis();
//		long t2 = currCalendar.getTimeInMillis();
//		double span = t2 - t1;
//		double days = Math.floor(span / (1000 * 24 * 60 * 60));
//		double h = currCalendar.get(Calendar.HOUR_OF_DAY);
//		double m = currCalendar.get(Calendar.MINUTE);
//		double s = currCalendar.get(Calendar.SECOND);
//		return ((s + (m * 60) + (h * 3600)) / 86400) + days;
//	}
//
//	/**
//	 * 创建工作薄口令保护字符串
//	 */
//	public static String generatePasswordHash(String password) {
//		if (password == null || password.isEmpty()) return "";
//
//		int pwLen = password.length();
//		int pwHash = 0;
//		for (int i = pwLen; i > 0; i--) {
//			char c = password.charAt(i - 1);
//			pwHash = ((pwHash >> 14) & 0x01) | ((pwHash << 1) & 0x7fff);
//			pwHash ^= c;
//		}
//		pwHash = ((pwHash >> 14) & 0x01) | ((pwHash << 1) & 0x7fff);
//		pwHash ^= (0x8000 | ('N' << 8) | 'K');
//		pwHash ^= pwLen;
//
//		char[] hexDigest = "0123456789ABCDEF".toCharArray();
//		char[] chars = new char[8];
//		for (int i = 0, j = -1; i < 4; i++) {
//			byte b = (byte) ((pwHash >> (24 - i * 8)) & 0xFF);
//			chars[++j] = hexDigest[(b >> 4) & 0xF];
//			chars[++j] = hexDigest[b & 0xF];
//		}
//		return new String(chars);
//	}
//
//	public class Relationship {
//		private String rootFolder;
//		private List<String> targetList;
//		private List<String> typeList;
//		private List<String> idList;
//		private int currentId;
//
//		public String getRootFolder() {
//			return rootFolder;
//		}
//
//		public List<String> getTargetList() {
//			return targetList;
//		}
//
//		public List<String> getTypeList() {
//			return typeList;
//		}
//
//		public List<String> getIdList() {
//			return idList;
//		}
//
//		public Relationship(String path)
//        {
//            this.idList = new ArrayList<String>();
//            this.targetList = new ArrayList<String>();
//            this.typeList = new ArrayList<String>();
//            this.rootFolder = path;
//            this.currentId = 1;
//        }
//
//		public void addRelationshipEntry(String target, String type) {
//			this.targetList.add(target);
//			this.typeList.add(type);
//			String id = "rId" + Integer.toString(this.currentId);
//			this.idList.add(id);
//			this.currentId++;
//		}
//	}
//
//	public class Packer {
//
//		static final String CONTENTTYPE_DOCUMENT = "[Content_Types].xml";
//
//		private List<byte[]> dataList;
//		private List<String> pathList;
//		private List<String> contentTypeList;
//		private List<Relationship> relationships;
//		private List<Boolean> includeContentType;
//
//		public Packer() {
//			dataList = new ArrayList<byte[]>();
//			pathList = new ArrayList<String>();
//			contentTypeList = new ArrayList<String>();
//			relationships = new ArrayList<Relationship>();
//			includeContentType = new ArrayList<Boolean>();
//		}
//	    
//		public void pack(OutputStream outputStream) {
//			try {
//				byte[] contentTypes = createContenTypeDocument();
//				ZipOutputStream out = new ZipOutputStream(outputStream);
//				out.setMethod(ZipOutputStream.DEFLATED);
//				ZipEntry entry = new ZipEntry(CONTENTTYPE_DOCUMENT);
//				out.putNextEntry(entry);
//				out.write(contentTypes, 0, contentTypes.length);
//				byte[] data;
//				for (int i = 0, n = relationships.size(); i < n; i++) {
//					Relationship _item = relationships.get(i);
//					data = createRelationshipDocument(_item);
//					entry = new ZipEntry(_item.getRootFolder());
//					out.putNextEntry(entry);
//					out.write(data, 0, data.length);
//				}
//				for (int i = 0, n = dataList.size(); i < n; i++) {
//					data = dataList.get(i);
//					entry = new ZipEntry(pathList.get(i));
//					out.putNextEntry(entry);
//					out.write(data, 0, data.length);
//				}
//				out.flush();
//				out.close();
//			} catch (Exception e) {
//				throw new RuntimeException("Error while packing the file.", e);
//			}
//		}
//	    
//		public void addPart(String name, String contentType, Document document) {
//			dataList.add(createBytesFromDocument(document));
//			pathList.add(name);
//			contentTypeList.add(contentType);
//			includeContentType.add(true);
//		}
//
//		public void addPart(String name, String contentType, Document document,
//				boolean includeInContentType) {
//			dataList.add(createBytesFromDocument(document));
//			pathList.add(name);
//			contentTypeList.add(contentType);
//			includeContentType.add(includeInContentType);
//		}
//	    
//		public Relationship createRelationship(String path) {
//			Relationship r = new Relationship(path);
//			relationships.add(r);
//			return r;
//		}
//	    
//		private byte[] createContenTypeDocument() {
//			StringBuilder sb = new StringBuilder();
//			sb.append("<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">");
//			sb.append("<Default Extension=\"xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\" />");
//			sb.append("<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" />");
//
//			for (int i = 0, n = contentTypeList.size(); i < n; i++) {
//				if (!includeContentType.get(i)) continue;
//				sb.append("<Override PartName=\"/");
//				sb.append(this.pathList.get(i));
//				sb.append("\" ContentType=\"");
//				sb.append(this.contentTypeList.get(i));
//				sb.append("\" />");
//			}
//			sb.append("</Types>");
//			Document d = createXMLDocument(sb.toString());
//			return createBytesFromDocument(d);
//		}
//   
//		private byte[] createRelationshipDocument(Relationship rel) {
//			StringBuilder sb = new StringBuilder();
//			sb.append("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
//			for (int i = 0; i < rel.getIdList().size(); i++) {
//				sb.append("<Relationship Target=\"");
//				sb.append(rel.getTargetList().get(i));
//				sb.append("\" Type=\"");
//				sb.append(rel.getTypeList().get(i));
//				sb.append("\" Id=\"");
//				sb.append(rel.getIdList().get(i));
//				sb.append("\"/>");
//			}
//			sb.append("</Relationships>");
//			Document d = createXMLDocument(sb.toString());
//			return createBytesFromDocument(d);
//		}
//	}
//}
